package ping

import (
	"net"
	"time"
)

// Ping 结构体
// Timeout: 通用超时时间
// PingCount: 通用包数
type Ping struct {
	Timeout   int // 通用超时时间
	PingCount int // 通用包数
}

// NewPing 创建并初始化一个 Ping 实例
func NewPing(count, timeout int) *Ping {
	if timeout <= 0 {
		timeout = 5
	}
	return &Ping{
		PingCount: count,
		Timeout:   timeout,
	}
}

// icmpInfo 结构体
// Addr: 目标地址
// Conn: 连接
// Data: 数据
// debug: 调试标志
type icmpInfo struct {
	Addr  string
	Conn  net.Conn
	Data  []byte
	debug bool
}

// BatchPingResult 用于批量 Ping 的结果返回
// SuccessIPs: 成功的 IP 地址列表
// FailedIPs: 失败的 IP 地址列表
type BatchPingResult struct {
	SuccessIPs []string
	FailedIPs  []string
}

// PingResult 用于存储单次ping的结果统计
type PingResult struct {
	Host     string          // 目标主机
	Sent     int             // 发送包数
	Received int             // 接收包数
	Lost     int             // 丢失包数
	LossRate float64         // 丢包率 (百分比)
	MinRTT   time.Duration   // 最小往返时间
	MaxRTT   time.Duration   // 最大往返时间
	AvgRTT   time.Duration   // 平均往返时间
	RTTs     []time.Duration // 所有往返时间
}

// CalculateLossRate 计算丢包率
func (pr *PingResult) CalculateLossRate() {
	if pr.Sent > 0 {
		pr.Lost = pr.Sent - pr.Received
		pr.LossRate = float64(pr.Lost) / float64(pr.Sent) * 100.0
	}
}

// CalculateRTTStats 计算RTT统计信息
func (pr *PingResult) CalculateRTTStats() {
	if len(pr.RTTs) == 0 {
		return
	}

	pr.MinRTT = pr.RTTs[0]
	pr.MaxRTT = pr.RTTs[0]
	var total time.Duration

	for _, rtt := range pr.RTTs {
		if rtt < pr.MinRTT {
			pr.MinRTT = rtt
		}
		if rtt > pr.MaxRTT {
			pr.MaxRTT = rtt
		}
		total += rtt
	}

	pr.AvgRTT = total / time.Duration(len(pr.RTTs))
}
